X-TRACEは、レイトレーシングアルゴリズムを用いた3Dグラフィック
レンダリング システムです。
3D CADを用いた、市販のレイトレーシング
レンダラと異なり、X-TRACEは3Dグラフィックスを全てテキストで記述します。X-TRACEの記述言語は、C言語やPascal言語に見られるような、手続き(C言語の関数のようなものです)、局所変数、式、制御構文などをもった、強力なプログラミング言語であり、高度な物体定義を可能とします。
X-TRACEのプログラミング言語をMODELA(MODEling
LAnguage)と呼びます。本文は、MODELAのプログラミングマニュアルです。
X-TRACEの入力ファイルは、xtrace命令で始まり、{と}で挟まれた1つのブロックをもっています。X-TRACEは、入力ファイルが示されると、先頭のxtrace命令のブロックの中を実行した後、レイトレーシングを行います。
xtrace [<name>] { <block> }
以後、角カッコ[]で括られた部分は省略可能であることを意味します。この場合の<name>はオプションで、指定しても注釈としての意味しかありません。作品のタイトルなど、自由に使うことができます。<block>の部分には、本文の中で説明しているさまざまな命令やステートメントを使って3DCGの定義を記述します。
<block>の実行が正常に終わると、そこで定義された物体の情報を用いてレイトレーシングを実行します。
macro <macro> [= <string> [, <macro2> [=
<string2>] [, ...]]];
マクロ<macro>を宣言します。文字列<string>が指定されれば、<macro>に初期値として<string>を割り当てます。<string>が省略されると、<macro>には空の文字列""が割り当てられます。また、カンマで区切って複数のマクロを宣言することも可能です。
宣言したマクロは、$(<macro>)という書式で展開することができます。マクロの展開は、ダブルクォーテーションで括られた文字列の中以外なら、どこにでもおくことができます。
nmacro <macro> [= <string> [, <macro2> [=
<string2>] [, ...]]];
nmacro命令は、それが実行されるまでの間に、マクロ<macro>がすでに宣言されているかどうかで振る舞いを変えます。<macro>がすでに宣言されていると、nmacro命令は何もしません。<macro>が未宣言の時には、マクロ<macro>を宣言し、指定があれば、<string>で初期化します。
mprint <macro>, <format> [, <exp1> [, <exp2>[,...]]];
mprint命令は<macro>に文字列<format>を割り当てます。すでに宣言されたマクロは、mprint命令を使って内容を変更することができます。
<format>内で、記号#は特別な意味を持ちます。<format>中に#が現れると、式<exp1>を評価して、その値を文字列に変換し、#の位置に埋め込みます。2つめの#は、<exp2>……という様に対応して行きます。最終的に、式の数と<format>中の#の数はあっていないとエラーとなります。
#(<exp>)という書式で、式<exp>の値を正数に変換してその場所に埋め込みます。正数置換は、ダブルクォーテーションで括られた文字列の中以外なら、どこにでもおくことができます。<exp>の値は、0〜32767の間にないとエラーになります。この機能をうまく使うと、配列変数を使うことができるようになります。
var <variable> [= <exp> [, <variable2> [=
<exp2>] [, ...]]];
浮動小数値を保持するための変数<variable>を宣言します。式<exp>が指定されれば、初期値として<variable>に代入します。<exp>が省略されると、<variable>には0が代入されます。また、カンマで区切って複数の変数を宣言することも可能です。
nvar <variable> [= <exp> [, <variable2> [=
<exp2>] [, ...]]];
nvar命令は、それが実行されるまでの間に、変数<variable>がすでに宣言されているかどうかで振る舞いを変えます。<variable>がすでに宣言されていると、nvar命令は何もしません。<variable>が未宣言の時には、変数<variable>を宣言し、指定があれば、<exp>で初期化します。
MACINTOSH=1 |
Macintosh版の場合に宣言されています |
WINDOWS95=1 |
WINDOWS版の場合に宣言されています |
X68000=1 |
X68000版の場合に宣言されています |
MODELA=<ver> |
MODELAのバージョンナンバ |
XTRACE=<ver> |
X-TRACEエンジンのバージョンナンバ |
PI=3.1415 |
円周率π |
on=1 |
スイッチ(on) |
off=0 |
スイッチ(off) |
true=1 |
真理値(TRUE) |
false=0 |
真理値(FALSE) |
fwid |
現在のグラフィック画面の横幅 |
fhei |
現在のグラフィック画面の高さ |
fbit |
現在のグラフィック画面のビット深度 |
fwid、fhei、fbitは、グラフィック画面を開いていないときにはデフォルトのグラフィック画面パラメータが入っています。
XTRACE変数には、X-TRACEエンジンのバージョンが設定されます。
X-TRACEでは、数値を要求するところでは式を書くことができます。式は、演算子と数値関数とからなります。
X-TRACEで使用することのできる演算子とその優先順位を示します。
優先順位 | |
1. ( ) |
括弧 |
2. ^ ! |
べき乗 論理否定 |
3. * / |
乗除算 |
4. + - |
加減算 |
5. < = > |
比較演算子 |
6. & | |
論理積 論理和 |
同じ優先順位の演算子の場合には左から右へ処理されます。また、すべて2項演算子となっており、単項のマイナス演算子(つまり負号)などは存在しません。負の数を表現する時や論理否定をとる場合には、(-3)、(!logic)のように括弧でくくるようにしてください。比較演算子の"<="と">="は存在しませんので注意してください。
cos(x) |
xラジアンの余弦(コサイン) |
sin(x) |
xラジアンの正弦(サイン) |
tan(x) |
xラジアンの正切(タンジェント) |
acos(x) |
アークコサイン(演算結果はラジアン) |
asin(x) |
アークサイン(演算結果はラジアン) |
atan(x) |
アークタンジェント(演算結果はラジアン) |
exp(x) |
指数関数 |
ln(x) |
自然対数関数(底は、e=2.718) |
abs(x) |
絶対値 |
sqrt(x) |
平方根 |
sq(x) |
平方(自乗) |
sgn(x) |
xの符号(x>0で1、x<0で-1、x=0では0) |
int(x) |
xの値を越えない最大の整数 |
rnd(x) |
0とxの間の乱数発生 |
rseed <exp>;
rnd(x)関数の乱数の種を設定します。<exp>は正の整数で、この値が疑似乱数列の種になります。rseedにいつも同じ値を指定すると、実行のたびにいつも同じ乱数が発生します。実行のたびに違う乱数を発生させたい場合には、<exp>に0または、負の数を与えます。この場合、rseedが実行されたときの「時間」から得た数値を疑似乱数列の種にするので、実行の度に違った乱数を発生することができます。
ambi indx, r,g,b, I_amb, T_dif,half;
空間(大気)の絶対屈折率indxは、通常、空気をイメージするなら、1に設定すればよいでしょう。水中などのCGを作るつもりなら、水の屈折率1.33を設定します。
(r,g,b)の組は、背景の色を指定します。視線がどの物体とも交点を持たず、空間に発散したとき(すなわち、背景)がこの色になります。
環境光強度I_ambは周囲から一様にやってくる光の強度で、色は白色です。I_ambは0〜1の間の数値で、晴れた野外の風景の場合には0に近い、0.1〜0.2、曇りの野外や部屋の中など、光を散乱する物体が多くある場合には少し大きめの0.3〜0.5というように使い分けます。
拡散透過率T_dif(0〜1)は、光の半減期halfと組み合わせて霧や霞の中のような効果を出すのに使います。halfを設定すると、光は距離half進む毎に元の強度の半分に減衰します。もし、光を全く減衰させたくない場合には、halfを0に設定します。
view <wid/2>, top_x,top_y,top_z, ref_x,ref_y,ref_z,
eye_x,eye_y,eye_z [, eye_r];
注目する点(ref_x,ref_y,ref_z)を、視点(eye_x,eye_y,eye_z)の位置から眺める形になります。この時、画面の上にしたい方向を(top_x,top_y,top_z)として指定します。画面の横幅をwidとすると、viewにはその半分の<wid/2>を設定します。また、省略可能なパラメータeye_rは、視点を円形に仮定したときの半径であり、省略すると0です。このパラメータは、分散レイトレーシングを使って、ピントに奥行きを持たせるときに使います。
inf a,b,c, deg, r,g,b;
この光線源は、太陽のように、無限に遠い位置から光を発する光線源をエミュレートするものです。(a,b,c)はベクトルで、無限に遠い光線源の存在する方向を表しています。degは、光線源の見かけの大きさで、単位は角度の単位、°(degree)です。例えば太陽の見かけの大きさは、およそ0.267°です。月の見かけの大きさもほぼ同じくらいです。(r,g,b)は光線の強度です。
loc l,m,n, rd, r,g,b;
電球など、有限の距離に存在して、光を四方八方に発散する光線源を定義します。このような光線源を局所光線源と呼びます。局所光線源は球状の物体で、(l,m,n)は局所光線源の中心座標、rdは光線源の半径、(r,g,b)は光線の強度です。局所光線源の実体(球面)は、locが定義されたときに有効な属性を持ちます。属性については後の章で説明します。
spot l,m,n, rd, r,g,b, a,b,c, deg;
スポットライトのような光線源をエミュレートするものです。スポット光線源は、局所光線源と同じように球状の物体ですので、中心座標(l,m,n)と半径rdを指定します。続いて光線の強度(r,g,b)を設定するところまでは局所光線源の場合と全く同じです。スポット光線源の場合には、このあとにスポットライトで照らす方向(a,b,c)と、スポットの広がる角度degを設定します。
スポットライトで指定する光線の強度は、スポットの中心部の強度です。光線の強度はスポットの周辺に近ずくほど弱くなり、degで示された一番外側の角度では強度0となります。
X-TRACEの属性とは、物体の色や材質感などのパラメータを総称しています。
attr <atr_name> [= { <def_block> }] ;
<def_block>の中で、属性に関するパラメータを設定します。<def_block>は通常の<block>とは異なり、属性の設定項目だけを記述することができます。属性<atr_name>は、それを宣言したところから次のattr命令が現れるまで有効であり、また、すでに宣言されている属性を再び有効にするには、<def_block>を省略した書式を用います。
以下、<def_block>の各設定項目について説明します。
index idx;
物体の屈折率idx。idxが設定されると、その属性は透明体の宣言とみなされます。X-TRACEでは、透明体の場合にはフレネルの式を使って、屈折率と入射角から、反射率と透過率を計算するので、R_spcおよびT_spcは、計算された反射率と透過率に対する係数として働きます。従って、通常、idxを設定した場合には、R_spcとT_spcには1を設定します。
color r,g,b;
物体の色(r,g,b)。各成分の値の範囲は、0〜1。
diff R_dif,I_amb;
物体の色は、ほぼ拡散反射率R_difと、r、g、bの積で決まります。I_ambは環境から来る光の強度で、光線源からの光に下駄として働きます。R_dif、I_ambとも、値の範囲は0〜1です。
refl R_spc,high,beta;
鏡面反射率R_spc(0〜1)が大きいと、物体は鏡のように光を反射します。highは、ハイライト計算の際にR_spcの係数として働きます。ハイライト先鋭度betaは、0.1〜0.6の範囲で、小さな値は金属のように鋭いハイライト、大きな値は艶消しの面のように鈍いハイライトとなります。
tran T_spc,T_dif,half;
鏡面透過率T_spc(0〜1)が大きい値だと、ガラスのように透明な物体になります。拡散透過率T_dif(0〜1)は、光の半減期halfと組み合わせて霧や霞の中のような効果を出すのに使います。全く曇りのない透明な物体のT_difは0です。halfを設定すると、光は距離half進む毎に元の強度の半分に減衰します。もし、光を全く減衰させたくない場合には、halfを0に設定します。
dupli <atr_name2>;
すでに宣言されている属性<atr_name2>の宣言の内容を、現在の属性<atr_name>の宣言に複製します。dupliで複製した後に、上述の設定項目を設定しなおすことで、<atr_name2>と一部だけ異なる<atr_name>を宣言することができます。
option <opt> [, <opt2> [, ...]];
<opt>、<opt2>は、rgb、hsv、disdeg=<deg>、disdg=<deg>、all0、all1のいずれかです。
rgb、hsvは、colorの設定でRGB色座標系を使うか、hsv色座標系を使うかを指定するもので、colorの前に宣言しないと意味がありません。
disdeg(またはdisdg)は、分散レイトレーシングの際の反射・屈折レイの分散の角度を<deg>に指定します。分散しない場合は0°ですが、ここに角度>0°を指定して分散させることにより、磨いた金属表面のような鈍い反射や曇りガラスのような鈍い透過を表現することができます。
all0が指定されると、その時点で、本節で説明したattr命令の全ての設定値を0に設定します。これは、muxaによる多重属性で、加算によって変更したくない項目を0にしておくときに使います。
all1は、all0と逆に全ての設定値を1に設定します。これは、muxmによる多重属性で、乗算によって変更したくない項目を1にしておくときに使います。
attr命令の設定項目を省略した場合のデフォルト値を示します。
// attrのデフォルト値
attr <atr_name>=
{
index 0;
color 0,0,0;
diff 0,0;
refl 0,0,0;
tran 0,0,0;
muxa 1.;
};
cmap <cmap_name>, x1,y1,x2,y2, w,h;
現在のグラフィック画面の(x1,y1)-(x2,y2)の矩形領域をw×hのマッピングデータとして取り込みます。
attr <atr_name> [= { <def_block> }] ;
色マッピングは、物体の表面に画像を張り付ける手法であり、attr命令の<def_block>の中で設定するようになっています。
以下、色マッピングに関する<def_block>の各設定項目について説明します。
nmap <cmap_name>;
cmap命令で取り込んだマッピングデータ名を指定し、カラーマッピングを有効にします。頭にnのつかないmapは、古いスタイルのマッピング宣言です。基本的にはnmapを使って下さい。
mreg u1,u2, v1,v2, pu,pv;
マッピング座標系(u-v座標系)上の、マッピングデータを張り付ける範囲(u1,v1)-(u2,v2)と、マッピングデータの平行移動(pu,pv)です。これらのパラメータは、すべて、張り付けるマッピングデータの大きさで正規化されていて、例えば、平行移動(pu,pv)に(0.5,0.5)を指定すると、画面の大きさの半分だけ、u軸、v軸方向に平行移動することを意味します。
u1がu2より大きいか、もしくは等しい設定とすると、マッピングデータは無限に繰り返されます。v1、v2の設定も同じです。
msph cx,cy,cz, nx,ny,nz, vx,vy,vz ,a,b [, r];
中心座標(cx,cy,cz)の球面へのマッピングです。マッピングデータの(u,v)=(0,0)の点における法線ベクトル(nx,ny,nz)と、マッピングデータの上の方向(vx,vy,vz)を指定します。aはマッピング球面の赤道方向の一周にa枚のマッピングデータを張り付けること、bは経線方向の半周にb枚のマッピングデータを張り付けることをそれぞれ意味します。rはマッピング球面の半径で、普通この半径の内側にしかマッピングされません。rを省略するか0に設定すると、rに無限大を指定したのと同じ結果となり、全空間にマッピングがかかります。
mcyl cx,cy,cz, nx,ny,nz, vx,vy,vz ,a,b [, r];
中心座標(cx,cy,cz)の円柱面へのマッピングです。マッピングデータの(u,v)=(0,0)の点における法線ベクトル(nx,ny,nz)と、マッピングデータの上の方向(vx,vy,vz)を指定します。aはマッピング円柱面の赤道方向の一周にa枚のマッピングデータを張り付けること、bはマッピング円柱面の中心軸方向にマッピングデータの高さをbにして張り付けることをそれぞれ意味します。rはマッピング円柱面の半径で、振る舞いはmsphの場合と同様です。
mpla cx,cy,cz, nx,ny,nz, vx,vy,vz ,a,b [, s];
中心座標(cx,cy,cz)の平面へのマッピングです。平面の法線ベクトル(nx,ny,nz)と、マッピングデータの上の方向(vx,vy,vz)を指定します。a、bはマッピング平面上でのマッピングデータの大きさです。sはmplaによるマッピングの領域を制御します。
sに正の数を設定すると、平面の法線ベクトル(nx,ny,nz)と逆側にある部分にしかマッピングされなくなります。sに負の数を設定すると、逆に法線ベクトルの側にだけマッピングされます。sを省略するとゼロが設定されたものとみなされ、平面の両側(全空間)にマッピングがかかります。
mdsk cx,cy,cz, nx,ny,nz, vx,vy,vz ,a,b [, s];
中心座標(cx,cy,cz)の円盤面へのマッピングです。マッピングデータの(u,v)=(0,0)の点における法線ベクトル(nx,ny,nz)と、マッピングデータの上の方向(vx,vy,vz)を指定します。aはマッピング円盤面の円周(一周)にa枚のマッピングデータを張り付けること、bはマッピング円盤面の放線方向にマッピングデータの高さをbにして張り付けることをそれぞれ意味します。sはmdskによるマッピングの領域を制御し、振る舞いはmplaの場合と同様です。
muxa coef [, <atr_name3>] ;
和による多重マッピングの設定です。coefは、現在の属性<atr_name>に対する正の係数で、<atr_name3>には多重する別な属性を指定します。
muxm coef [, <atr_name3>] ;
積による多重マッピングの設定です。coefは、現在の属性<atr_name>に対する正の係数で、<atr_name3>には多重する別な属性を指定します。
属性atr1、atr2、atr3が次のように宣言された場合の多重の方法を示します。
attr atr3 = { ... muxa c3; ... };
attr atr2 = { ... muxm c2,atr3; ... };
attr atr1 = { ... muxa c1,atr2; ... };
多重マッピング=((c1*atr1)*c2*atr2) + c3*atr3
overlay pix,<atr_name2>;
オーバレイマッピングの設定です。クロマキー合成のように、マッピングデータの中で、pixで示される色を持った領域を別な属性<atr_name2>で置き換える働きをします。pixは、getpix命令、col2pix命令などを使って生成します。
option <opt> [, <opt2> [, ...]];
<opt>、<opt2>は、mrefl、mspokeの何れかです。これらの設定はnmapの前に宣言しないと無効です。mreflは、反射マッピングと言って、反射ベクトルの方向を使ってマッピングを行うことを指示します。mspokeは、放射マッピングと言って、反射ベクトルの代わりに法線ベクトルを使います。
なお、msph、mcyl、mpla、mdskは、このうちいずれか1つを選んで設定します。マッピングには、最低限map項目の設定が不可欠ですが、それ以外の項目は全てオプションであり、省略すると、適当なデフォルト値を使ってマッピングします。
// マッピングのデフォルト値
attr ColorMap=
{
nmap <cmap_name>; // 必須
msph 0,0,0, 0,0,1, 0,1,0 ,1,1, 0;
mreg 0,0, 0,0, 0,0;
}
bmap <bmap_name>, x1,y1,x2,y2, w,h;
現在のグラフィック画面の(x1,y1)-(x2,y2)の矩形領域をw×hの凹凸マッピングデータとして取り込みます。この時、グラフィック画面の色情報から輝度の成分を抽出し、輝度の高い(明るい)部分が高く、輝度の低い(くらい)部分を低いものとみなして、凹凸データを作り出します。輝度は、白色が一番明るく、高さ1、黒色が一番暗く、高さ0とします。
bump <bmp_name> [= { <def_block> } ] ;
凹凸マッピングは、物体の表面にあたかも凹凸があるかのごとくシェーディングする手法であり、<def_block>の中でパラメータを設定します。<def_block>は通常の<block>とは異なり、凹凸マッピングの設定項目だけを記述することができます。凹凸マッピング名<bmp_name>は、それを宣言したところから次のbump命令が現れるまで有効であり、すでに宣言されている凹凸マッピングを再び有効にするには、<def_block>を省略した書式を用います。
以下、<def_block>の各設定項目について説明します。
nmap <bmap_name>, height;
bmap命令で取り込んだマッピングデータ名を指定します。また、bmap命令で取り込んだデータは、一番明るい白色が高さ1、一番暗い黒色が高さ0となるように凹凸データを取り込みますので、この、高さ1への係数としてheightを設定します。頭にnのつかないmapは、古いスタイルのマッピング宣言です。基本的にはnmapを使って下さい。
nmap以外の項目については、色マッピングの項目と同様ですので省略します。ただし、bumpにはoption、overlayの設定項目はありません。
bump ;
凹凸マッピングをかけない状態に戻したい場合には、全てのパラメータを省略した本書式を用います。
X-TRACEでは、球面や平面など、中身の詰まった側(solid)と中身の詰まっていない側という、表裏の概念を持った二次曲面およびメタボールと、そうした概念のないポリゴン(多角形)といった形状を扱うことができます。solidの部分を持った形状は、and、orなどの論理演算を使って組み合わせることができます。
plane l,m,n, a,b,c;
中心座標(l,m,n)、法線ベクトル(a,b,c)の平面を定義します。(a,b,c)と逆の向きがsolidです。
sphere l,m,n, r;
中心座標(l,m,n)、半径rの球面を定義します。中心を含む側がsolidです。
ellips l,m,n, p,q,r;
中心座標(l,m,n)、x軸、y軸、z軸方向の半径がそれぞれ、p、q、rの楕円面を定義します。中心を含む側がsolidです。
oval l,m,n, a,b,c, q,r;
中心座標(l,m,n)、回転軸(a,b,c)、(a,b,c)方向の半径q、(a,b,c)に垂直な方向の半径rの回転楕円面を定義します。中心を含む側がsolidです。
cylind l,m,n, a,b,c, r;
中心座標(l,m,n)、中心軸の方向(a,b,c)、半径rの円柱面を定義します。中心軸を含む側がsolidです。
cone l,m,n, a,b,c, r/t;
中心座標(l,m,n)、中心軸の方向(a,b,c)と、中心からt離れた点の半径rの円錐面を定義します。中心軸を含む側がsolidです。
quadra l,m,n, a1,a2,a3, a4,a5,a6, a7,a8,a9, a0;
一般の2次曲面を定義します。
通常、p、q、r、p*q*r、q*r、r/tなどの値は正ですが、負になるように設定すると、solidの側が反転します。
meta : model { <block> }
<block>内で以下のようにして定義したメタ面がメタボールとなります。
meta d : sphere l,m,n, r;
meta d : ellips l,m,n, p,q,r;
meta d : oval l,m,n, a,b,c, q,r;
meta d : cylind l,m,n, a,b,c, r;
メタボールの中心の濃度をdとして、それぞれ、球メタ、(回転)楕円メタ、円柱メタを定義します。
// メタボール
meta : model
{
meta 1.3 : sphere -1,0,0, 1.5;
meta 1.4 : sphere 1,0,0, 1.5;
meta -0.8 : sphere 0,1,0, 2;
}
poly [<name>] { <block> }
<block>内でpt命令またはpv命令で指定された頂点をつなぎ合わせて、多角形を定義します。
pt x,y,z [, atr] ;
(x,y,z)に頂点を宣言します。オプションのatrで属性名を指定すると、頂点ごとに異なる属性を持ったポリゴンを作成することが可能です。
pt命令はpoly命令の<block>内でのみ有効な命令です。
pv x,y,z, a,b,c [, atr] ;
(x,y,z)に頂点を宣言し、その頂点の法線ベクトルを(a,b,c)に設定します。オプションのatrで属性名を指定すると、頂点ごとに異なる属性を持ったポリゴンを作成することが可能です。
pv命令はpoly命令の<block>内でのみ有効な命令です。
もし、宣言された頂点が同一平面上にない場合には、適当な平面上に自動的に投影して多角形を作成します。また、ポリゴンにスムーシングをかけない場合には、頂点の数や凸多角形、凹多角形などの制限は特にありません。ただし、ポリゴンにスムーシングをかける場合には、凸多角形でなければなりません。
smooth [ n [, a]] : model { <block> }
<block>内で定義されたポリゴンの全ての頂点を調べて、頂点を共有しているポリゴンの法線ベクトルと属性を補間します。この時、鋭角で交わるポリゴンの法線や属性を補間すると、不自然になるので、ポリゴンの交わる角度で補間するか否かを選択できるようになっています。ポリゴンの交わる角度がn°(degree)より鋭角ならば、法線の補間はしません。同じく、a°より鋭角なら、属性の補間はしません。省略すると、nには120、aには-1が設定されたものとみなします。
roku <ROKU4_file_name> [= { <def_block> }];
六角大王ver4、ver5のデータファイルを読み込みます。以下、<def_block>の項目について説明します。
roku_attr <on_off>;
六角大王のカラーデータを取り込む場合はon、取り込まない場合にはoffを指定します。
roku_face <on_off>;
六角大王のポリゴンデータを取り込む場合はon、取り込まない場合にはoffを指定します。本設定より六角大王での設定の方が優先しますので注意して下さい。
roku_line <line_thickness>;
六角大王のラインデータを取り込む場合は<line_thickness>に標準の線の太さを設定します。<line_thickness>を0に設定すると、六角大王のラインデータを取り込みません。本設定より六角大王での設定の方が優先しますので注意して下さい。
roku_color <roku_color>, <atr_name>;
六角大王の色<roku_color>にMODELAで宣言した属性<atr_name>を割り当てます。六角大王で使われる色の名前と色番号(<roku_color>に指定する)の対応を以下に示します。また、予め色番号に対して宣言されている変数名を同時に示します。
六角色 |
色番号 |
既宣言変数 |
|
|
|
灰 |
0 |
c6gray |
水 |
1 |
c6skyblue |
青 |
2 |
c6blue |
薄い赤 |
3 |
c6lightred |
緑 |
4 |
c6green |
黄色 |
5 |
c6yellow |
肌色 |
6 |
c6skin |
褐色 |
7 |
c6brown |
真っ白 |
8 |
c6truewhite |
真っ黒 |
9 |
c6trueblack |
のっぺり肌 |
10 |
c6nopperi |
赤色 |
11 |
c6red |
白色 |
12 |
c6white |
roku_del <roku_color> [, <roku_color2> [, ...
]] ;
roku_add <roku_color> [, <roku_color2> [, ... ]]
;
六角大王データ(ラインおよびポリゴンデータ)の取り込みを六角大王での色毎に制御します。roku_delの後ろにカンマで区切って指定した色番号を持つポリゴンおよびラインは、取り込みません。逆にroku_addで指定した色番号を持つポリゴンおよびラインは、取り込まれます。この時、色番号として負の数(c6allとして宣言されています)を与えると、全ての色を指定したことになります。
roku_refl <R_spc>,<high>,<beta>;
roku_colorで六角大王の色とMODELAの属性の対応を取らなかった場合に使われる、デフォルトの属性値の中で、反射に関するパラメータを設定します。パラメータの意味は、attr命令のreflと同じです。
roku命令の<def_block>のデフォルトを示します。
// roku命令のデフォルト
roku <ROKU4_file_name>=
{
roku_attr on;
roku_face on;
roku_line 0.01;
roku_add c6all;
roku_refl 0.01,30,0.4;
};
dxf <DXF_file_name> [= { <def_block> }];
DXFファイルを読み込みます。以下、<def_block>の項目について説明します。
dxf_attr <on_off>;
DXFの属性情報を取り込む場合はon、取り込まない場合にはoffを指定します。
dxf_silent <on_off>;
dxf命令のワーニングメッセージの表示のON / OFFを制御します。
dxf命令の<def_block>のデフォルトを示します。
// dxf命令のデフォルト
roku <DXF_file_name>=
{
dxf_attr on;
dxf_silent off;
};
vrml <VRML_file_name> [= { <def_block> }];
VRML
ver.1.0のファイルを読み込みます。VRMLには、ver.2.0の規格が存在しますが、読み込みに対応しているのはver.1.0のファイルだけとなります。
現在、<def_block>に設定できる項目はありません。
not [<name>] { <block> }
solidの否定。solidの部分とそうでない部分を反転します。
and [<name>] { <block> }
solidの部分のandをとります。
or [<name>] { <block> }
solidの部分のorをとります。
nand [<name>] { <block> }
solidの部分のnandをとります。"not { and { <block> }
}"と等価です。
nor [<name>] { <block> }
solidの部分のnorをとります。"not { or { <block> }
}"と等価です。
boundary <primitive> { <block> }
<block>内で定義した物体をすっぽり包み込むことのできる<primitive>(境界体積という)を宣言することにより、レイトレーシングを高速化します。<primitive>はsphere、cylinderなど、基本形状の節で説明したものを宣言します。
物体の回転や拡大・縮小などの処理を一次変換と呼びます。一次変換の命令で影響を受ける命令を以下に示します。
quadra |
二次曲面定義 |
plane |
平面定義 |
sphere |
球面定義 |
cylind |
円柱面定義 |
cone |
円錐面定義 |
ellips |
楕円面定義 |
oval |
回転楕円面定義 |
inf |
平行光線源定義 |
loc |
局所光線源定義 |
spot |
スポット光線源定義 |
view |
視野面定義 |
attr |
属性宣言での色マッピング |
bump |
凹凸マッピング |
以下、一次変換の命令を説明します。
matrix a00,a01,a02,a03, a10,a11,a12,a13, a20,a21,a22,a23,
a30,a31,a32,a33;
平行移動まで含めた三次元の一次変換行列(4×4行列)を完全に指定します。行列のチェックは全く行っていませんので、逆行列の存在しない行列などを指定された場合の挙動は保証しません。
para l,m,n;
物体の位置を平行移動します。この命令で、例えば原点(0,0,0)にあった点は、(l,m,n)の点に平行移動します。
sim a,b,c;
sim a;
物体の拡大・縮小を行います。このような一次変換を相似変換と呼びます。a、b、cはそれぞれ、x軸、y軸、z軸方向の拡大・縮小率で、a、b、cが1より大きい場合には拡大、1より小さいときには縮小となります。また、a、b、c全てに同じ数値を設定する場合には、b、cを省略した第二の書式を使うことができます。
screw a,b,c, θ;
screwx θ;
screwy θ;
screwz θ;
指定した方向(a,b,c)に右ネジ(screw)をねじ込む向きに回転する変換です。すなわち、(a,b,c)は回転軸の方向、θは回転角で、単位は°(degree)です。右ネジをねじ込む方向に回転するときθは正の値、逆回転なら負の値になります。
また、回転軸(a,b,c)がx軸、y軸、z軸の何れかである場合、screwxなどの短縮命令を使うことができます。
rot a,b,c, θ;
rotx θ;
roty θ;
rotz θ;
screw命令と同様です。
lever a1,b1,c1, a2,b2,c2;
leverx a2,b2,c2;
levery a2,b2,c2;
leverz a2,b2,c2;
2つのベクトル(a1,b1,c1)および(a2,b2,c2)をレバーに見立て、レバー(a1,b1,c1)をレバー(a2,b2,c2)に倒すような方向に回転します。
また、はじめのベクトル(a1,b1,c1)が、特にx軸、y軸、z軸である場合、leverxなどの短縮命令を使うことができます。
rev a1,b1,c1, a2,b2,c2;
revx a2,b2,c2;
revy a2,b2,c2;
revz a2,b2,c2;
lever命令と同様です。
if <exp> { <block> }
[ elif <exp2> { <block2> } ]
[ : ]
[ else { <block3> } ]
<exp>、<exp2>は式で、式の値が0のとき「偽(FALSE)」、0でないとき「真(TRUE)」と判断されます。
<exp>が真ならば、<block>が実行され、<block2>、<block3>は、読み飛ばされます。<exp>が偽ならば、<block>を読み飛ばし、elifがあれば<exp2>を評価して<exp2>が真ならば<block2>を実行し、偽ならば<block2>を読み飛ばします。elifが複数あれば、この処理をelifの数だけ繰り返します。最後に、全ての式が偽だった場合、elseがあれば<block3>を実行します。
ifvar <var_name> { <block> }
[ else { <block2> } ]
<var_name>という名前の変数が既に宣言されていた場合、<block>を実行します。宣言されていなかった場合には、<block>を読み飛ばし、elseがあれば<block2>を実行します。
ifnvar <var_name> { <block> }
[ else { <block2> } ]
ifvar文と比べて論理が逆転し、<var_name>という名前の変数が未宣言の場合に<block>を実行し、宣言されていた場合には<block>を読み飛ばし、elseがあれば<block2>を実行します。
ifacc <file_name> { <block> }
[ else { <block2> } ]
<file_name>という名前のファイルが既に存在していた場合、<block>を実行します。存在していなかった場合には、<block>を読み飛ばし、elseがあれば<block2>を実行します。
ifnacc <file_name> { <block> }
[ else { <block2> } ]
ifaccr文と比べて論理が逆転し、<file_name>という名前のファイルが存在しない場合に<block>を実行し、存在していた場合には<block>を読み飛ばし、elseがあれば<block2>を実行します。
while <exp> { <block> }
式<exp>を評価した値を真理値と見なし、その値が真の間、<block>を実行します。もし、はじめから<exp>の真理値が偽であれば、<block>は一度も実行されず、読み飛ばされます。
repeat { <block> } until <exp>;
はじめに一度<block>を実行します。その後、式<exp>を評価して<exp>が真のあいだ<block>を実行します。
後ろにブロック{<block>}を要求する命令では、<block>に入る前と、抜けた後で、次に挙げる状態をプッシュ/ポップします。
変数および変数名
マクロおよびマクロ名
属性および属性名
凹凸マッピングおよび凹凸マッピング名
手続きおよび手続き名
一次変換
従って、{<block>}内で宣言された状態は、その{<block>}内でのみ有効であり、{<block>}を抜けたときにはこれらの状態は無効になっています。
model [<name>] { <block> }
<block>をネストする命令です。<block>には、ステートメントや、代入、物体の定義、属性の宣言などを記述することができます。model命令は<block>に入る前と、抜けた後で、状態をプッシュ/ポップします。
modela [<name>] { <block> }
modela命令は、model命令と似ていますが、model命令のように、状態をプッシュ/ポップしません。
static : <statement>
通常変数名などの宣言は、それが宣言された<block>内でのみ有効ですが、static命令を使うと、<block>の外でも有効となる静的な宣言をすることができます。<block>を宣言するmodel命令にstaticを作用すると、その<block>内の宣言は全て静的な宣言になります。
dynamic : <statement>
dynamic命令は、static命令が指定された<block>内で、その<block>内でのみ有効となる動的な宣言をするときに使います。
procedure <prc_name> [ <var> [, <var2> [,
...]]] { <block> }
手続き<prc_name>を定義します。<var>は、<prc_name>への引数を受ける変数で、先頭が$$で始まっていると、文字列マクロ(<macro>)として解釈されます。<var>、<macro>は、<block>内で使用することができます。
<prc_name> [ <exp> [, <exp2> [, ...]]] ;
procedure命令で定義された手続き<prc_name>の呼び出しです。基本的には、引数<exp>の数と型(数値なのかマクロなのか)は<prc_name>の定義と合っていなければエラーになります。ただし、<prc_name>の定義の中で省略される可能性のあるパラメータに対する処理(nvar、nmacroなど)をしている場合には、数があっていなくても必ずしもエラーとはなりません。
ginit fwid,fhei,fbit [, aspx,aspy] ;
幅fwid、高さfhei、色深度fbitのグラフィック画面を開き、白色で初期化します。オプションのaspx、aspyは、画面のアスペクト(横/縦)比です。色深度は、16を指定すると約3万色の画面、32を指定すると1677万色の画面になります。また、グラフィック画面は、左上隅が(0,0)、右下隅が(fwid-1,fhei-1)になります。
wipe;
グラフィック画面を白色で塗りつぶします。
pix2col <pixcel>,
<var_name_r>,<var_name_g>,<var_name_b>;
グラフィック描画に使う、<pixcel>という形式のデータから、RGBの成分を抽出し、変数<var_name_r>、<var_name_g>、<var_name_b>に代入します。
col2pix r,g,b, <var_name>;
(r,g,b)で示される色情報から、グラフィック描画で用いるpixcelを作成して<var_name>で示される変数に代入します。
pset x,y,<pixcel>
座標(x,y)に<pixcel>のドットを打ちます。<pixcel>には、col2pixで変換した色の他、予め宣言されている以下の色を使うことができます。
cblack |
黒 |
cgray |
(黒 + 白)/2の灰色 |
cwhite |
白 |
cblue |
青色 |
cred |
赤色 |
ccyan |
紫色 |
cgreen |
緑色 |
cmagenta |
水色 |
cyellow |
黄色 |
line x1,y1,x2,y2,<pixcel>;
(x1,y1)と(x2,y2)をつなぐ直線を描画します。
box x1,y1,x2,y2,<pixcel>,<fill>;
(x1,y1)-(x2,y2)を対角線とする箱を描画します。箱の枠のみを描画する際には、<fill>を0に、箱の中を塗りつぶすときには<fill>を1に設定します。予め宣言されている以下の変数を使うと便利です。
solid box、circleなどの塗り潰し指定
wire box、circleなどの枠線描画指定
paint x,y,<pixcel>;
(x,y)で指定された一点を囲む領域を一定の色<pixcel>に塗りつぶします。
circle x,y,r,<pixcel>,<fill>,<aspect>;
中心(x,y)、半径rの円を描画します。円周のみを描画するには<fill>を0に、円の内側を塗りつぶすには<fill>を1に設定します。
getpix x,y,<var_name>;
グラフィック画面上の座標(x,y)の点のpixcelを変数<var_name>に取り込みます。
ptnfil x,y,w,h, <rgb> [, <rgb2> [, ... ] ] ;
(x,y)を左上頂点、(w,h)を横幅と高さとする領域に対して、<rgb>、<rgb2>……、で示されるドットを順次表示します。<rgb>は
rrggbbの形式でドットの色を指定します。ここで、rr、gg、bbはそれぞれ00からffまでの16進数です。
w、hが正の数だった場合、座標(x,y)からはじめてxを順次+1しながらドットを表示します。ドットが左端に達すると、xの値を元に戻し、yを+1して<rgb>がなくなるまで繰り返します。
wが負の数なら横幅はabs(w)で、ドットをx+w-1から-1しながら右に表示します。同様にhが負の数なら高さはabs(w)で、ドットをy+h-1から-1しながら上へ表示します。
<rgb>で示されるドットの数がw×hより少ない場合には、<rgb>の数だけドットを表示して終了し、エラーとはなりません。逆に<rgb>で示されるドットの数がw×hより多かった場合、(x,y)を元の位置に戻し、最初に表示した点を上書きしながら<rgb>がなくなるまで表示し続けます。
load <file_name> [, <resID>];
<file_name>で示されるファイルをロードします。ファイルが見つからなかった場合、エラーになります。ファイル<file_name>は、PICT(Apple)、PICT
Resource(Apple)、BMP(Windows)、xPIC(X68000-PIC)、PXX(Original)のいずれかでなければなりません。
<resID>は<file_name>がPICT
Resourceファイルだった場合に有効で、PICTリソースのリソースIDを示します。省略されると、最後に見つかったPICTリソースをロードします。<resID>が存在しなかった場合、あるいは、PICTリソースが1つも存在しなかった場合には、エラーになります。
loadff <file_name> [, <file_name2> [, <file_name3>[, ...]]];
<file_name>、<file_name2>、<file_name3>、……の順で指定されたファイルがアクセスできるかどうか調べ、最初にアクセスできたファイルをロードします。リストされた全てのファイルが見つからなかった場合、エラーになります。ファイルは、PICT(Apple)、PICT
Resource、BMP(Windows)、xPIC(X68000-PIC)、PXX(Original)のいずれかでなければなりません。
PICT
Resourceの場合の挙動は、load命令で<resID>を省略した場合と同じです。
save <file_name> [, <resID>];
現在のグラフィック画面を<file_name>のファイル名でセーブします。この時、セーブ時の形式は<file_name>の拡張子で決まります。
拡張子 |
セーブ形式 |
|
|
なし |
Apple PICTファイル(Macintosh版) |
なし |
Windows BMPファイル(Windows95版) |
.pict |
Apple PICTファイル(※1) |
.pics |
Apple PICT Resourceファイル(※1) |
.rsrc |
Apple PICT Resourceファイル(※1) |
.pic |
X68000 PICファイル |
.pxx |
Original Photo compressファイル(※2) |
.bmp |
Windows BMPファイル |
※1 Windows95版では、Apple
PICTファイルのセーブ/ロードには対応していません。
※2 以前のバージョンまで使用していた、.prex、.pxa、.pxbという拡張子は、サポートされなくなりました。拡張子を.pxxに変更して下さい。
<resID>はPICT
Resourceセーブの際に有効で、セーブするリソースIDを示します。省略されると、ID128から探して最初に見つかった空きIDにセーブします。また、指定された<resID>がすでに存在していた場合、そのPICTリソースは上書きされます。
hash [<name>] { <block> }
metal [<name>] { <block> }
X-TRACEの姉妹品として、球状の光線源による球面の半影を高速に演算するHASH(HAlf-SHadow
ray-tracing system)と、球メタを高速に演算するMETAL(METa-bALl
ray-tracing
system)があります。X-TRACEのソースデータの先頭命令は、"xtrace {
<block>}"ですが、同様にHASHの先頭命令はhash、METALの先頭命令はmetalです。また、各レンダラは、HASH<METAL<<X-TRACEの関係にあり、METALはHASHのデータを、X-TRACEはHASHとMETALのデータを読み込んでレイトレーシングすることができます。
inc <file_name>;
<file_name>で示されるファイルを読み込みます。
rgb;
hsv;
attr命令のcolorや、col2pixなど3つのパラメータで色を指定する命令において、RGB色座標系を使うか、HSV色座標系を使うかを切り替える命令です。rgb命令を実行した以降の色指定はRGB色座標系、hsv命令を実行した以降の色指定はHSV色座標系として扱われます。値の範囲は、0<=r,g,b,s,v<=1、0<=h<360です。色相h(hue)は0(360)で赤色、以下60置きに、赤→黄→緑→水色→青→紫→赤と変わります。
screen fwid,fhei,fbit [, x1,y1,x2,y2 ] ;
レイトレーシングする画像の大きさfwid×fheiを指定します。色数fbitは、16(約3万色)または32(約1677万色)の何れかです。省略可能なパラメータは、(x1,y1)-(x2,y2)を対角線とする四角形の中をレイトレーシングすることを示します。省略されると、全画面をレイトレーシングします。
cond pix,sub, raylv,shdlv,dislv;
レイトレーシングのコンディションを設定します。pixでレイトレーシングのピクセル(画素)サイズpix×pixを指定します。通常は0または1を指定します。subは、1ピクセルの中をさらにsub×sub個に分割してレイトレーシングし(サブサンプリング)、その平均値をピクセルの色とするオプションです。raylvは、反射、屈折などの光を追跡するレベル、shdlvは、影処理を行うレベルです。dislvは、分散レイトレーシングのストキャスティック(ランダム)サンプリングする数を指定します。
anime <var_name>, fbeg,fend,fstp,<save_file_name>;
ソースファイル中にanime命令があると、そのファイルはアニメーションデータとして処理されます。anime命令は、変数<var_name>を宣言して、<var_name>にfbegからfendまでの整数値をfstp飛びに代入しながら、ファイル全体を実行し、その都度レイトレーシングして1枚1枚のアニメーション画像を作成して行きます。画像をセーブするときのファイル名は拡張子によって決まり、save命令で示したフォーマットが認識されます。
Macintosh版は、次のフォーマットの意味が若干、save命令と異なります(以下の拡張子はWindows95版ではサポートされていません)。
拡張子 |
セーブ形式 |
|
|
.rsrc |
Apple PICSファイル(ID:128〜) |
.pics |
Apple PICSファイル(ID:128〜) |
上述の拡張子が指定された場合には、ID128から始まるPICSリソースとして、各画像をセーブします。
errmsg <format> [, <exp> [, <exp2> [, ...]]] ;
エラーメッセージ<format>を表示します。もし、<format>の中に#があると、<exp>の値を#の位置に埋め込みます。2つ目の#には<exp2>と言うように式の値を埋め込んで表示します。
exit;
実行を強制終了します。レイトレーシングは行いません